package main

import (
	"bolg_admin/app/models/user"
	"bolg_admin/bootstrap"
	"bolg_admin/config"
	"bolg_admin/pkg/jwt"
	"bolg_admin/pkg/logger"
	"bolg_admin/pkg/model"
	"bolg_admin/routes"
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"os"
	"strings"
)

func init() {
	// 初始化配置信息
	config.Initialize()
}

func MiddleWare() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		isToken := ctx.GetHeader("isToken")
		fmt.Println("istoken\n", isToken)
		if isToken != "false" {
			tokenString := ctx.GetHeader("Authorization")
			fmt.Println("token\n", tokenString)
			//验证前端传过来的token格式，不为空，开头为Bearer
			if tokenString == "" || !strings.HasPrefix(tokenString, "XQ") {
				ctx.JSON(401, gin.H{
					"data": gin.H{},
					"meta": gin.H{
						"msg":  "token为空",
						"code": 401,
					},
				})
				return
			}
			tokenString = tokenString[3:] //截取字符
			fmt.Println("截取\n", tokenString)
			//解析token:common/jwt.go
			token, claims, err := jwt.ParseToken(tokenString)
			//解析失败||解析后的token无效
			logger.LogError(err)
			if err != nil || !token.Valid {
				ctx.JSON(401, gin.H{
					"data": gin.H{},
					"meta": gin.H{
						"msg":  "token无效",
						"code": 401,
					},
				})
				return
			}

			//token通过验证, 获取claims中的UserID
			userId := claims.UserId

			var userInf user.User
			//查询数据库
			model.DB.First(&userInf, userId)

			// 验证用户是否存在
			fmt.Println("用户信息\n", userInf)
			if userInf.ID == 0 {
				ctx.JSON(401, gin.H{
					"data": gin.H{},
					"meta": gin.H{
						"msg":  "用户不存在",
						"code": 401,
					},
				})
				return
			}
			//用户存在 将user信息写入上下文
			ctx.Set("userId", userId)

			ctx.Next()

		}

	}
}

func main() {
	//如果需要控制台输出带有颜色的字体，请使用下面代码
	gin.ForceConsoleColor()

	// 记录到文件。
	f, _ := os.Create("gin.log")
	//gin.DefaultWriter = io.MultiWriter(f)

	// 如果需要同时将日志写入文件和控制台，请使用以下代码。
	gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
	//创建路由
	r := gin.Default()

	// 注册中间件
	r.Use(MiddleWare())

	bootstrap.SetupDB()
	//routes.LoadArticle(r)
	routes.LoadUser(r)
	routes.Article(r)

	if err := r.Run(":8090"); err != nil {
		fmt.Println(err)
	}
}
